package thread;

/**
 * 加锁方式:
 *      1. 修饰普通的方法,本质上是针对 "某个对象" 进行加锁  (this) ,当两线程竞争同一对象时,才有竞争
 *      2. 修饰一个代码块,指定针对哪个对象进行加锁
 *      3. 修饰一个静态方法 --- 相当于针对当前类的类对象  (反射)  Count2.class
 */

/**
 * 死锁: 的必要条件
 *      互斥使用: 一个锁被一个线程占用了,其他线程就占用不了
 *      不可抢占: 一个锁被一个线程占用了,其他线程就不能将其抢走
 *      请求与保持: 当一个线程占据了多把锁,除非显式地释放锁,不然就始终持有该锁
 *      环路等待: 等待关系,成环了~  A等 B,B等 C,C等 A   -----  实际开发,关键从这里入手
 */

class Count2{

    public static int count;

    // 进入方法加锁,离开方法解锁
//    public synchronized void increase() {
//        count++;
//    }

//    public void increase() {
//        // 进入代码块加锁
//        // 这里是针对 this 对象进行加锁,但是如果该方法是静态方法,没有 this
//        synchronized(this){
//            count++;
//        }
//    }

    public static void increase() {
        // 进入代码块加锁
        // 该方法是静态方法,没有 this,就针对类对象进行加锁
        // 类对象: .class文件被加载到 JVM 内存中的模样
        synchronized(Count2.class){
            count++;
        }
    }


}
public class Synchronized {
    public static void main(String[] args) {


    }
}
